package org.example.api;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.*;

@Slf4j
@RestController
@RequestMapping("/hello")
public class HelloApi {
    @GetMapping("/m1")
    public Object m1(String name, String sex) {
        return "hello:" + name +"," + sex;
    }
    @PostMapping("/m2")
    public Object m2(String name , String sex){
        return  "hello:"+name+","+sex;
    }

    @Value("${local.file.path}")
    String localFilePath;

    @PostMapping("/m3")
    public Object m3 (MultipartFile file) {
        log.info("接收到一个上传文件的请求");
        //创建一个哈希表，用于返回结果
        Map map = new HashMap();
        //1.获取目标文件的大小,用long类型存储size
        long size = file.getSize();
        log.info("目标文件大小:" + size);
        //假设限制文件最大不能超过10MB
        if (size > 1024 * 1024 * 10) {
            map.put("code","-1");
            map.put("message","文件太大，不能超过10MB");
            log.info("文件太大，返回错误，上传结束");
            return map;
        }
        //2.获取目标文件的原名
        String fileName= file.getOriginalFilename();
        log.info("目标文件名:" + fileName);
        //截取出文件名的扩展名（从最后一个开始截取）
        String suffix =fileName.substring(fileName.lastIndexOf("."));
        log.info("目标文件扩展名:" + suffix);
        //定义一个支持的文件格式集合（假设只支持.pdf|.xls|.xlsx三种格式的文件）
        List<String> supportSuffix = Arrays.asList(".pdf",".xls",".xlsx");
        //判断目标文件的格式是否在支持的范围中，用!取反
        if (!supportSuffix.contains(suffix)) {
            map.put("code","-1");
            map.put("message","文件格式不支持");
            return map;
        }
        //3.用UUID生成一个全局唯一的文件名
        String uuid = UUID.randomUUID().toString()
                .replace("-","").toUpperCase();
        log.info("生成UUID:" + uuid);
        //4.拼接UUID和原文件的扩展名，得到新的文件名
        fileName = uuid + suffix;
        log.info("拼接新的文件名:" + fileName);
        //5.用配置文件中的路径创建一个文件夹对象
        File folder = new File(localFilePath);
        log.info("创建本地存储文件的文件夹");
        //判断文件夹是否存在
        if (!folder.exists()) {
            //如果文件夹不存在，手动创建此路径
            folder.mkdirs();
        }
        log.info("创建本地文件");
        //6.用新的文件夹创建一个本地文件，并指定其文件夹
        File localFile = new File(localFilePath, fileName);
        try {
            //7.把网络文件落地存储到本地文件中
            file.transferTo(localFile);
            log.info("本地落地成功");
            map.put("code","1");
            map.put("message", fileName);
        } catch (IOException e) {
            log.info("本地落地失败");
            map.put("code","-1");
            map.put("message", "文件上传失败!");
        }
        return map;
    }
}
